package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.service.CourseCategoryService;
import com.xuecheng.module.dto.CourseCategoryDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author 星河一叶Ck
 * @date 2025/4/17
 */

@Slf4j
@Service
@RequiredArgsConstructor
public class CourseCategoryServiceImpl implements CourseCategoryService {

    private final CourseCategoryMapper courseCategoryMapper;

    @Override
    public List<CourseCategoryDto> queryTreeNodes(String id) {
        List<CourseCategoryDto> courseCategoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);
        // 将list转为map, 以备使用, 排除根节点
        Map<String, CourseCategoryDto> mapTemp = courseCategoryTreeDtos
                .stream()
                // 过滤 遍历的item 当item的id和传过来的id是不同的 那么保留
                // 比如 id为1 那么为1的就过滤掉
                .filter(item -> !item.getId().equals(id))
                // 第一个参数是以什么作为key 那么就是id了
                // 第二个参数是 value值是什么 这里直接原先的value直接作为value
                // 第三个参数是 当key重复的时候 保留哪一个
                .collect(Collectors.toMap(key -> key.getId(), value -> value, (key1, key2) -> key2));

        // 最终返回的list
        List<CourseCategoryDto> categoryTreeDtos = new ArrayList<>();

        // 依次遍历每个元素,排除根节点
        courseCategoryTreeDtos.stream()
                .filter(item -> !item.getId().equals(id))
                .forEach(item -> {
                    // 如果获取到的元素 他的父节点是根节点 那么他就是二级节点了
                    if (item.getParentid().equals(id)) {
                        // 那么就往二级节点的数组里面 直接放入该二级节点
                        categoryTreeDtos.add(item);
                    }

                    // 找到当前节点的父节点
                    CourseCategoryDto courseCategoryTreeDto = mapTemp.get(item.getParentid());
                    // 如果父节点不为空 那么就是存在
                    if (courseCategoryTreeDto != null) {
                        // 然后如果该列表中 也就是该父节点 都有子节点数组 若子节点数组不存在 那么
                        // 就应该创建出来 后续遍历 属于该节点下的子节点 就存入到该父节点的children数组下
                        if (courseCategoryTreeDto.getChildrenTreeNodes() == null) {
                            courseCategoryTreeDto.setChildrenTreeNodes(new ArrayList<>());
                        }

                        // 然后往里面放子节点
                        courseCategoryTreeDto.getChildrenTreeNodes().add(item);
                    }
                });

        // 返回该list
        return categoryTreeDtos;
    }
}
